package com.kexio.security.service;

import java.util.List;
import java.util.Optional;

import com.kexio.dynamic.datasource.annotation.DS;
import com.kexio.dynamic.datasource.annotation.Master;
import com.kexio.dynamic.datasource.annotation.Slave;
import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.domain.User;
import com.kexio.security.dto.UserRequest;

/**
 * 用户数据访问接口
 * 
 * @author kexio
 */
public interface UserRepository {

    /**
     * 保存用户
     * @param user 用户实体
     * @return 保存后的用户实体
     */
    @Master // 写操作强制使用主库
    User save(User user);

    /**
     * 根据ID查找用户
     * @param id 用户ID
     * @return 用户实体
     */
    @Slave // 读操作使用从库
    Optional<User> findById(Long id);

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户实体
     */
    @Slave // 读操作使用从库
    Optional<User> findByUsername(String username);

    /**
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 用户实体
     */
    Optional<User> findByEmail(String email);

    /**
     * 根据手机号查找用户
     * @param phone 手机号
     * @return 用户实体
     */
    Optional<User> findByPhone(String phone);

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsByUsername(String username, Long excludeId);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsByEmail(String email, Long excludeId);

    /**
     * 检查手机号是否存在
     * @param phone 手机号
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsByPhone(String phone, Long excludeId);

    /**
     * 分页查询用户
     * @param request 查询请求
     * @param pageRequest 分页请求
     * @return 分页结果
     */
    PageResponse<User> findPage(UserRequest request, PageRequest pageRequest);

    /**
     * 根据部门ID查找用户列表
     * @param deptId 部门ID
     * @return 用户列表
     */
    List<User> findByDeptId(Long deptId);

    /**
     * 根据角色ID查找用户列表
     * @param roleId 角色ID
     * @return 用户列表
     */
    List<User> findByRoleId(Long roleId);

    /**
     * 根据状态查找用户列表
     * @param status 状态
     * @return 用户列表
     */
    List<User> findByStatus(Integer status);

    /**
     * 更新用户最后登录信息
     * @param id 用户ID
     * @param lastLoginTime 最后登录时间
     * @param lastLoginIp 最后登录IP
     * @param loginCount 登录次数
     * @return 更新记录数
     */
    int updateLastLoginInfo(Long id, java.time.LocalDateTime lastLoginTime, String lastLoginIp, Integer loginCount);

    /**
     * 删除用户
     * @param id 用户ID
     * @return 删除记录数
     */
    int deleteById(Long id);

    /**
     * 批量删除用户
     * @param ids 用户ID列表
     * @return 删除记录数
     */
    int deleteByIds(List<Long> ids);

    /**
     * 统计用户总数
     * @return 用户总数
     */
    long count();

    /**
     * 根据条件统计用户数
     * @param request 查询条件
     * @return 用户数
     */
    long countByRequest(UserRequest request);
}
